import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.List;


public class Kid implements Runnable {
	
	

	private String nome;
	private Integer porta;
	private String server;
	private Enterteiner e;
	private KidId kidId;
	private boolean palloncino=false;


public Kid (String nome,Integer porta,String server,Enterteiner e ){
	   	this.setNome(nome);
	   	this.setPorta(porta);
	   	this.server=server;
	   	this.e = e;
	   	kidId=new KidId(nome,porta);
	   	System.out.println("nome "+this.getNome()+" porta "+this.getPorta());
	   		   	
   }



public void setNome(String nome) {
	this.nome = nome;
}



public String getNome() {
	return nome;
}



public void setPorta(Integer porta) {
	this.porta = porta;
}



public Integer getPorta() {
	return porta;
}



public void setServer(String server) {
	this.server = server;
}



public String getServer() {
	return server;
}
   
   
public void run() {
	//String matchName,String kidName,int port)
	List<KidId> partecipanti=e.joinGame("partita1",getNome(),getPorta());
	KidId vicino=null;
	
	System.out.println("Sono "+getNome()+" nel mio run partecipanti size "+partecipanti.size());
	KidId vicinoID=null;
	
	//si fa solo dopo avvio partita
	
	for(Integer i=0;i<partecipanti.size();i++){
		//System.out.println("partecipanti size "+partecipanti.size());
		KidId altroGiocatore=partecipanti.get(i);
		//System.out.println("Ciclo partecipanti altrogiocatore " +altroGiocatore.getNome());
		//Mi cerco nella partita
		if((altroGiocatore.getNome().equals(nome))){ 
			//TODO se sono il primo devo essere contattato e fare nuova lista
			if (i!=0) {
				vicino=partecipanti.get(i-1);
				//contatta il tuo vicino!
				System.out.println("Sono ["+ getNome()+ "] Contatto il mio vicino" +vicino.getNome());
				//devo dare al vicino la mia porta e il mio nome in moda da aggiungermi!
				//sendMessage(vicino.getNome(),"localhost",vicino.getPorta());
				sendMessage(altroGiocatore.getNome(),"localhost",altroGiocatore.getPorta());
				
				vicinoID=attendNetworkcomuniComunicationForKid();
				//aggiungo il mio vicino alla mia lista Ma se ho il vicino devo aggiungermi io alla sua lista
				partecipanti.add(vicinoID);
				
				
			}
			else
				
					System.out.println("Sono " +" ["+getNome()+"] il primo dei partecipanti attendo");
					vicinoID=attendNetworkcomuniComunicationForKid();
					partecipanti.add(vicinoID);
					vicino=partecipanti.get(partecipanti.size()-1);
					//contatta il tuo vicino!
					System.out.println("Sono ["+ getNome()+ "] Contatto l'ultimo" +vicino.getNome());
					sendMessage(vicino.getNome(),"localhost",vicino.getPorta());
					//partecipanti.add(vicinoID);
				
		}
	}
		
		//chiedo la palla all animatore
		setPalloncino(e.getBaloon(nome));
		 System.out.println("Sono "+vicino.getNome()+ "Preso Palloncino dall'animatore");
		 //arriva segnale di inizio musica
		 KidSentPalloncino send =new KidSentPalloncino(this,vicinoID);
		 KidRecivePalloncino recive =new KidRecivePalloncino(this, vicinoID);
		 send.start();
		 recive.start();
		 
		 int i=0;
		 try {
			Thread.sleep(10000000);
		} catch (InterruptedException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		send.destroy();
		recive.destroy();
			 
		 }
		
		

	
protected synchronized boolean getPalloncino(){
	return palloncino;
}

	
protected synchronized void setPalloncino(boolean palloncino){
	this.palloncino=palloncino;
}



private void sendMessage(String nomeVicino, String serverVicino, Integer portaVicino) {
	ObjectOutputStream out=null;
	Socket requestSocket=null;
	try {
		requestSocket = new Socket("localhost", portaVicino);
		out= new ObjectOutputStream(requestSocket.getOutputStream());
		ObjectInputStream in = new ObjectInputStream(requestSocket.getInputStream());
		out.writeObject( nome +"%"+ porta);
		out.flush();
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}finally{
			//4: Closing connection
			try{
				out.close();
				requestSocket.close();
			}
			catch(IOException ioException){
				ioException.printStackTrace();
			}
	
}
}


private KidId attendNetworkcomuniComunicationForKid(){
	String message=null;
	ObjectInputStream in=null;
	Socket connection=null;
	ServerSocket providerSocket=null;
	try {
		providerSocket = new ServerSocket(porta, 10);
		connection = providerSocket.accept();
		ObjectOutputStream out = new ObjectOutputStream(connection.getOutputStream());
		in = new ObjectInputStream(connection.getInputStream());
		message = (String)in.readObject();
		System.out.println("sono ["+getNome()+"]messaggio ricevuto "+ message);
		//qui devo aggiungere il mio nuovo vicino
		//partecipanti.add
	
	
	} catch (Exception e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	finally{
		//4: Closing connection
		try{
			in.close();
			providerSocket.close();
		}
		catch(IOException ioException){
			ioException.printStackTrace();
		}
	}
	String[] kid=message.split("%");
	System.out.println(kid[0]+"    "+ kid[1]);
	return new KidId(kid[0], new Integer(kid[1]));

}  
   
}
